# views.py
import os
import uuid
from django.conf import settings
from django.core.paginator import Paginator
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from django.utils.text import get_valid_filename
from .models import Ptgb

from django.db.models import Q


def ptgb_list(request):
    # 获取筛选条件
    # category = request.GET.get('category')  # 筛选条件，比如“中草药”或“西药”或“自制剂”等
    search_query = request.GET.get('search_query',None)  # 搜索关键字
    tiaojian=''
    if search_query is not None:
        ptgb_queryset=Ptgb.objects.filter(
            a29__endswith=search_query).order_by('pta25')
        tiaojian='&search_query='+search_query
    else:
        ptgb_queryset=Ptgb.objects.order_by('pta25')

    # for item in ptgb_queryset:
    #     if item.pic:
    #         item.pic_count=len([p for p in item.pic.split(',') if p.strip()])
    #     else:
    #         item.pic_count=0

    # 初始化查询集并排序
    # ptgb_queryset = Ptgb.objects.all().order_by('pta25')

    # 筛选：按分类（如中草药、西药、自制剂等）
    # if category:
    #     ptgb_queryset = ptgb_queryset.filter(ybm__startswith=category)

    # 搜索：查询 a2 和 a29 字段
    # if search_query:
    #     ptgb_queryset = ptgb_queryset.filter(
    #         Q(a2__icontains=search_query) |
    #         Q(a29__icontains=search_query)
    #     )
    # else:
    #     search_query = ''

    # 分页
    paginator = Paginator(ptgb_queryset, 15)  # 每页 15 条数据
    page_number = request.GET.get('page')  # 获取当前页码
    page_obj = paginator.get_page(page_number)
    total_count = ptgb_queryset.count()  # 查询集的总数

    # 渲染模板并传递筛选条件
    return render(request, 'ptgb_list.html', {
        'page_obj': page_obj,
        'tiaojian': tiaojian,  # 保留搜索关键字
        'total_count': total_count,  # 打印查询集的总数
    })


def ptgb_detail(request, pk):
    # 显示 ptgb 的详情页
    ptgb = get_object_or_404(Ptgb, pta25=pk)
    existing_pics = ptgb.pic.split(',') if ptgb.pic else []
    context = {
        'ptgb': ptgb,
        'existing_pics': existing_pics,
        'MEDIA_URL': settings.MEDIA_URL,  # 传递 MEDIA_URL 到模板
    }
    return render(request, 'ptgb_detail.html', context)


def upload_images(request, ptgb_id):
    """
    第3点：在上传文件时，文件名以 pta25 的值开头；
          同一文件夹中找到符合 pta25_数字.后缀 的所有文件，最大数字 + 1 用作新的文件名。
    """
    if request.method == 'POST':
        ptgb = get_object_or_404(Ptgb, pta25=ptgb_id)
        images = request.FILES.getlist('images')
        saved_paths = []

        # 读取现有的图片路径列表
        existing_pics = ptgb.pic.split(',') if ptgb.pic else []

        # 获取当前时间用于路径
        now = timezone.now()
        year = now.strftime('%Y')
        month = now.strftime('%m')
        upload_dir = os.path.join(settings.MEDIA_ROOT, 'upload', year, month)
        os.makedirs(upload_dir, exist_ok=True)

        for image in images:
            # 验证文件类型
            if image.content_type not in ['image/png', 'image/jpg', 'image/jpeg', 'image/gif']:
                return JsonResponse({'success': False, 'message': '不支持的文件类型。'}, status=400)

            # 验证文件大小（不超过3MB）
            if image.size > 3 * 1024 * 1024:
                return JsonResponse({'success': False, 'message': '图片大小超过3MB。'}, status=400)

            # 处理文件扩展名
            original_extension = os.path.splitext(image.name)[1].lower()
            if not original_extension:
                # 若无扩展名，默认给 .jpg
                original_extension = '.jpg'

            # # ============ 核心修改：根据 pta25 + 最大数字 + 1 生成文件名 ============
            # max_index = 0
            # for f in os.listdir(upload_dir):
            #     # 形如 pta25_{ptgb.pta25}_数字.后缀
            #     # 例： pta25_666_2.jpg
            #     if f.startswith(f"p_{ptgb.pta25}_"):
            #         # 拆分，找到数字部分
            #         parts = f.split("_")
            #         if len(parts) >= 3:
            #             # parts[2] 可能带扩展名
            #             numeric_part = parts[2].split('.')[0]
            #             try:
            #                 current_num = int(numeric_part)
            #                 if current_num > max_index:
            #                     max_index = current_num
            #             except ValueError:
            #                 pass
            # ============ 核心修改：根据 pta25 + 最大数字 + 1 生成文件名 ============
            max_index = 0
            # 获得当前的系统日期和时间，格式为yyyymmddhhmmss
            now = timezone.localtime(timezone.now())
            current_time = now.strftime('%Y%m%d%H%M%S')
            for f in os.listdir(upload_dir):
                # 形如 pta25_{ptgb.pta25}_数字.后缀
                if f.startswith(f"{ptgb.pta25}_"):
                    # 拆分，找到数字部分
                    parts = f.split("_")
                    if len(parts) >= 3:
                        # parts[2] 可能带扩展名
                        numeric_part = parts[1].split('.')[0]
                        try:
                            current_num = int(numeric_part)
                            if current_num > max_index:
                                max_index = current_num
                        except ValueError:
                            pass
            new_file_index = max_index + 1
            unique_filename = f"{ptgb.pta25}_{new_file_index}_{current_time}{original_extension}"
            # ===================================================================

            file_path = os.path.join(upload_dir, unique_filename)

            # 保存文件到指定目录
            with open(file_path, 'wb+') as destination:
                for chunk in image.chunks():
                    destination.write(chunk)

            # 生成相对路径（存储到数据库）
            relative_path = os.path.join('upload', year, month, unique_filename).replace('\\', '/')
            saved_paths.append(relative_path)

        if not saved_paths:
            return JsonResponse({'success': False, 'message': '未上传任何有效文件。'}, status=400)

        # 更新 ptgb 的 pic 字段
        updated_pics = existing_pics + saved_paths
        ptgb.pic = ','.join(updated_pics)
        ptgb.save()

        # 返回相对路径供前端使用
        return JsonResponse({'success': True, 'message': '文件上传成功。', 'paths': saved_paths})
    else:
        return JsonResponse({'success': False, 'message': '仅支持POST请求。'}, status=405)


def delete_image(request, ptgb_id):
    """
    第1点：图片删除没有反应，需确保前端以 POST 方式将 image_path 参数传给该视图。
    例如：
        fetch(`/delete_image/${ptgbId}/`, {
            method: 'POST',
            headers: {
                'X-CSRFToken': '{{ csrf_token }}',
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: new URLSearchParams({ 'image_path': someImagePath })
        })
    """
    if request.method == 'POST':
        ptgb = get_object_or_404(Ptgb, pta25=ptgb_id)
        image_path = request.POST.get('image_path')

        if not image_path:
            return JsonResponse({'success': False, 'message': '未提供图片路径。'}, status=400)

        existing_pics = ptgb.pic.split(',') if ptgb.pic else []

        if image_path not in existing_pics:
            return JsonResponse({'success': False, 'message': '图片不存在。'}, status=400)

        # 删除文件
        full_path = os.path.join(settings.MEDIA_ROOT, image_path)
        if os.path.exists(full_path):
            os.remove(full_path)
        else:
            return JsonResponse({'success': False, 'message': '文件不存在。'}, status=400)

        # 更新 pic 字段
        existing_pics.remove(image_path)
        ptgb.pic = ','.join(existing_pics)
        ptgb.save()

        return JsonResponse({'success': True, 'message': '图片删除成功。'})
    else:
        return JsonResponse({'success': False, 'message': '仅支持POST请求。'}, status=405)


def reorder_images(request, ptgb_id):
    """
    第2点：拖动图片后不能改变顺序，需确保前端收集好新顺序并以 POST + ordered_pics[] 的形式传递到该URL。
    例如：
        fetch(`/reorder_images/${ptgbId}/`, {
            method: 'POST',
            headers: {
                'X-CSRFToken': '{{ csrf_token }}',
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: new URLSearchParams({
                'ordered_pics[]': newOrder[0],
                'ordered_pics[]': newOrder[1],
                ...
            })
        })
    """
    if request.method == 'POST':
        ptgb = get_object_or_404(Ptgb, pta25=ptgb_id)
        ordered_pics = request.POST.getlist('ordered_pics[]')

        if not ordered_pics:
            return JsonResponse({'success': False, 'message': '未提供新的排序。'}, status=400)

        existing_pics = ptgb.pic.split(',') if ptgb.pic else []

        # 验证所有提供的路径都存在于当前记录中
        for pic in ordered_pics:
            if pic not in existing_pics:
                return JsonResponse({'success': False, 'message': f'图片 {pic} 不存在。'}, status=400)

        # 确保没有遗漏或多余的图片
        if set(ordered_pics) != set(existing_pics):
            return JsonResponse({'success': False, 'message': '排序图片列表不完整。'}, status=400)

        ptgb.pic = ','.join(ordered_pics)
        ptgb.save()

        return JsonResponse({'success': True, 'message': '图片顺序更新成功。'})
    else:
        return JsonResponse({'success': False, 'message': '仅支持POST请求。'}, status=405)